Merge 2 sorted listsΒΆ

def merge(A:list, B:list):
    C = [0]*(len(A) + len(B))
    i = k = n = 0
    while i < len(A) and k < len(B):
        if A[i] <= B[k]:              # <= better then <
            C[n] = A[i]; i += 1; n += 1
        else:
            C[n] = B[k]; k += 1; n += 1
    while i < len(A):
        C[n] = A[i]; i += 1; n += 1
    while k < len(B):
        C[n] = B[k]; k += 1; n += 1
    return C

def merge_sort(A):
    ''' Merge sort N*Log2(N) [recursion] '''
    if len(A) <= 1:
        return
    middle = len(A) // 2
    L = [A[i] for i in range (0, middle)]
    R = [A[i] for i in range (middle, len(A))]
    merge_sort(L)
    merge_sort(R)
    C = merge(L, R)
    # copy from merged to original array
    for i in range(len(A)):
        A[i] = C[i]

# test

def test_sort(sort_algorithm):

    print("Testing: ", sort_algorithm.__doc__)
    print("testcase #1: ", end="")
    A = [7, 3, 12, 8, 9, 1, 6]
    A_sorted = [1, 3, 6, 7, 8, 9, 12]
    sort_algorithm(A)
    print("Ok" if A == A_sorted else "Fail")

if __name__ == "__main__":
    test_sort(merge_sort)